package com.kamistoat.meimeimall.meimeimallseckill.service;

import com.kamistoat.meimeimall.common.utils.PageUtils;
import com.kamistoat.meimeimall.common.utils.Query;
import com.baomidou.mybatisplus.extension.service.IService;
import com.kamistoat.meimeimall.common.To.seckillTo.SecKillProductCacheTo;
import com.kamistoat.meimeimall.common.To.seckillTo.SecKillProductTo;
import com.kamistoat.meimeimall.common.To.seckillTo.SecKillSessionTo;
import com.kamistoat.meimeimall.common.utils.R;
import com.kamistoat.meimeimall.meimeimallseckill.entity.SeckillSessionEntity;

import java.util.List;
import java.util.Map;

/**
 * 秒杀活动场次
 *
 * @author kamistoat
 * @email linjianshanke@163.com
 * @date 2021-09-12 16:19:46
 */
public interface SeckillSessionService extends IService<SeckillSessionEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 上架未来三天的秒杀商品
     */
    void uploadThreeDaySecKill();

    /**
     * 删除已经过期一天的活动
     */
    void deleteOneDaySecKill();


    /**
     * 带缓查询当前时间段的秒杀。如果当前时间段没有秒杀活动则显示下一场最近的秒杀活动的。
     */
    SecKillSessionTo getCurrentSecKillSession();

    /**
     * 获取早已在缓存中预热的三天内的秒杀活动
     */
    List<SecKillSessionTo> getFutureSecKillSessionList();

    /**
     * 商品详情页，远程该商品未来三天是否有秒杀活动
     *
     * @param skuId skuId
     * @return 类间传输To
     */
    SecKillProductCacheTo getSkuInSession(Long skuId);

    /**
     * 前端秒杀商品
     *
     * @param sessionProId 场次-商品关联id。全局唯一
     * @param randomCode   秒杀商品随机码
     * @param skuId        商品skuId，用于和场次-商品关联Id做联合检查
     * @param num          要购买多少件商品
     * @return R对象。如果成功就把订单号放进去
     */
    void secKillProduct(Long sessionProId, String randomCode, Long skuId, Integer num);

    /**
     * 删除redis中已经缓存的原秒杀
     * 并重新检查相同id是否是1天以内的秒杀，如果是，立刻上架
     */
    void terminateSessions(List<String> redisSessionKeyList);

    /**
     * 获取最近三天的秒杀活动
     *
     * @return
     */
    List<SecKillSessionTo> getThreeDaySecKillSessionFormDatabase();

    /**
     * 检查secKillSession，不允许创建重复时间内的session
     *
     * @param seckillSession
     */
    R checkSeckillSession(SeckillSessionEntity seckillSession);

    /**
     * 强制删除缓存中所有的秒杀信息
     */
    void clearAllSecKillSession();

    /**
     * 从数据库获取未来所有的秒杀活动
     */
    List<SecKillSessionTo> getAllSecKillSessionFormDatabase();

    /**
     * 向数据库添加新的秒杀活动本体
     */
    void addSecKillSession(SeckillSessionEntity sessionEntity);

    /**
     * 修改一个秒杀活动本体的信息，注意可能涉及到预热活动的修改
     */
    void updateSecKillSession(SeckillSessionEntity sessionEntity);

    /**
     * 为秒杀活动绑定商品
     * @param secKillProductToList
     */
    void boundSessionProduct(List<SecKillProductTo> secKillProductToList);

    /**
     * 为秒杀活动修改商品
     * @param secKillProductToList
     */
    void updateSessionProduct(List<SecKillProductTo> secKillProductToList);
}

